/*
 * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
 * @Date: 2024-07-14 10:32:18
 * @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
 * @LastEditTime: 2024-07-18 09:59:31
 * @FilePath: /hw/110/Sig/Signal.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <cassert>
using namespace std;
void Print(sigset_t &pending)
{
    for(int i=31;i>0;i--)   //只有31个信号
    {
        if(sigismember(&pending,i))
        {
            cout<<"1";
        }
        else{
            cout<<"0";
        }
    }
    cout<<endl;
}
int main()
{
    cout<<"pid:"<<getpid()<<endl;
    // 1.屏蔽2号信号
    int cnt=0;
    sigset_t block, oblock;
    sigemptyset(&block); // 清空block；
    sigemptyset(&oblock);
    sigaddset(&block, 2); // 将2号信号置于block中
    // 1.1开始屏蔽，将其放到内核中
    int n = sigprocmask(SIG_SETMASK, &block, &oblock);
    assert(n==0);
    (void)n; // 只是骗过编译器，否则就会告警。。。。
    cout << "block 2 signal success....." << endl;
    while (true)
    {
        // 2.打印pending位图
        sigset_t pending;
        sigemptyset(&pending);
        int n = sigpending(&pending);
        assert(n == 0);
        //  3.打印pending位图
        Print(pending);
        sleep(1);
        //4.恢复信号递达
        ///////
        if(cnt==10)
        {
            cout<<"解除对2号信号的屏蔽"<<endl;
            int n=sigprocmask(SIG_UNBLOCK,&block,&oblock);
            assert(n==0);
        }
        cnt++; 
    }
    return 0;
}

// void hander(int signo)
// {
//     cout << "get a sig,nums is " << signo << endl;
//     exit(0);
// }
// // int main()
// // {
// //     signal(SIGINT,hander);//回调函数
// //     while (1)
// //     {
// //         cout << "I am working pid:" << getpid() << endl;
// //         sleep(1);
// //     }
// // }
// int main()
// {
//     signal(SIGFPE,hander);
//     // int *a = nullptr;
//     // *a=100;
//     int a=10;
//     a/=0;
//     return 0;
// }